xBB
Участник форума
Joined: 17 Aug 2007
Posts: 21
Карма: 0 поощрить/наказать
Location: Ташкент
|
Posted: Fri Aug 17, 2007 12:17 pm (написано за 5 минут 4 секунды)
Post subject: DbSimple и MySQL. Вопрос по кэшированию
|
|
Начал использовать DbSimple в своем проекте. Очень удобно. Большое спасибо за хорошую либу. По ходу дела возник вопрос. Я использую MySQL с включенным кэшированием запросов. Есть ли в этом случае какой нибудь смысл использовать средства DbSimple для кэширования в "зависимости от источников данных"? Ведь такая фича может оказаться кэшированием кэша. Кто как поступал в таких случаях?
|
|
xBB
Участник форума
Joined: 17 Aug 2007
Posts: 21
Карма: 0 поощрить/наказать
Location: Ташкент
|
Posted: Fri Aug 17, 2007 5:18 pm (спустя 5 часов 1 минуту; написано за 2 минуты 5 секунд)
Post subject:
|
|
Сам ответил на свой вопрос. Вот тест: Code (php): | скопировать код в буфер обмена | <?php error_reporting (www.php.net/error_reporting)(E_ALL); require_once './DbSimple/Generic.php'; $DB = DbSimple_Generic::connect('Mysql://Логин:Пароль@Хост/База');
// Кэш-хранилище $cach = array (www.php.net/array)(); $DB->setCacher('myCacher');
function myCacher($key, $value) { global (www.php.net/global) $cach; if (null !== $value) { $cach[$key] = $value; } else { return isset (www.php.net/isset)($cach[$key]) ? $cach[$key] : null; } }
// Возвращает текущий UNIX timestamp с микросекундами в формате float function getmicrotime() { list($usec, $sec) = explode (www.php.net/explode)(' ', microtime (www.php.net/microtime)()); return (float) $usec + (float) $sec; }
// Тестовая функция. $query_num - число запросов
function test($query_num) { global (www.php.net/global) $DB; $result = array (www.php.net/array)(); // Тест с кэшированием $time_start = getmicrotime(); $sql = ' -- CACHE: test.edit_time SELECT * FROM test ORDER BY NAME'; for ($i = 0; $i < $query_num; ++$i) { $DB->select($sql); } $result[] = getmicrotime() - $time_start;
// Тест без кэширования $time_start = getmicrotime(); $sql = 'SELECT * FROM test ORDER BY NAME'; for ($i = 0; $i < $query_num; ++$i) { $DB->select($sql); } $result[] = getmicrotime() - $time_start;
return $result; }
// Создаем тестовую таблицу
$sql = 'DROP TABLE IF EXISTS test'; $DB->query($sql);
$sql = 'CREATE TABLE test ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), edit_time TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX (edit_time) )'; $DB->query($sql);
for ($i = 0; $i < 100; ++$i) { $sql = 'INSERT INTO test (name, edit_time) VALUE (?, NOW())'; $DB->query($sql, md5 (www.php.net/md5)(rand (www.php.net/rand)())); }
// Тест на 10 запросов $result = test(10); echo (www.php.net/echo) '10 запросов с кэшированием: ' . $result[0] . ' сек.<br />'; echo (www.php.net/echo) '10 запросов без кэширования: ' . $result[1] . ' сек.<br /> <br />';
// Тест на 1000 запросов $result = test(1000); echo (www.php.net/echo) '1000 запросов с кэшированием: ' . $result[0] . ' сек.<br />'; echo (www.php.net/echo) '1000 запросов без кэширования: ' . $result[1] . ' сек.<br />'; | Вот результат: 10 запросов с кэшированием: 0.00926804542542 сек. 10 запросов без кэширования: 0.0164940357208 сек. 1000 запросов с кэшированием: 0.863590955734 сек. 1000 запросов без кэширования: 1.78387713432 сек. Правда, кэш у меня в тесте очень быстрый :) Надо будет еще на реальном проверить
|
|
Константин Жинько [tIT]
Сотрудник «Лаборатории»

Joined: 12 Jun 2004
Posts: 2264
Карма: 106 поощрить/наказать
Location: Москва
|
Posted: Fri Sep 28, 2007 12:53 pm (спустя 1 месяц 10 дней 19 часов 34 минуты; написано за 54 секунды)
Post subject:
|
|
xBB
На реальном я memcached использую - круче механизма еще не видел. Одна беда - оперативной памяти вагон должен быть (-;
|
|